#if _MSC_VER
 #pragma once
#endif

#ifndef __HERZELEID_PRECOMPILED_INCLUDED__
#define __HERZELEID_PRECOMPILED_INCLUDED__

// Defines the highest available Windows platform
#include <SDKDDKVer.h>

#ifndef STRICT
 #define STRICT
#endif // !STRICT

/// Windows Sdk Includes

#ifndef WIN32_LEAN_AND_MEAN
 #define WIN32_LEAN_AND_MEAN
#endif // !WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <initguid.h>

#ifndef HERZELEID_PHONE
 //#include <windowsx.h>
 #include <shlobj.h>
#endif

#include <sal.h>

#pragma  warning ( disable: 4244 )
/// Standard C/C++ Library Includes
#include <fstream>
#include <string>
#include <strsafe.h>
#include <sstream>
#include <iostream>
#include <stdint.h>
#include <future>
#include <thread>
#include <mutex>
#include <vector>
#include <queue>
#include <list>
#include <map>
#include <algorithm>
#include <functional>
#include <new>
#include <debugapi.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#include <memory>
#include <assert.h>
#include <process.h>
#include <wrl.h>
#include <wrl/client.h>
#include <varargs.h>
#include <exception>
#include <type_traits>
#include <utility>
#include <array>
#include <winsock.h>

#include <sal.h>
#include <concurrencysal.h>

#include <ppl.h>
#include <ppltasks.h>
#include <concurrencysal.h>
#include <concurrent_queue.h>
//#include <concurrent_priority_queue.h>
//#include <concurrent_unordered_map.h>
//#include <concurrent_unordered_set.h>
//#include <concurrent_vector.h>

#pragma  warning( default: 4244 )

//#include "HerzeleidCore.hxx"
#include "ReignCore.hxx"
//using namespace Herzeleid;
using namespace Reign::Standard;
using namespace Reign;

using namespace Microsoft;
#ifndef HERZELEID_DESKTOP
using namespace Windows;
#endif

#ifdef HERZELEID_DESKTOP
namespace Platform
{
	typedef Reign::Standard::ObjectPtr Object;
	typedef Reign::Standard::String16 String;
	typedef Reign::Standard::String16 *StringPtr;
	typedef std::shared_ptr<String16> StringArg;
	template <class U> class Array;
};
typedef Platform::Array<Platform::StringArg> StringPtrArray;
typedef Platform::Array<Platform::StringArg>* StringPtrArrayPtr;
typedef std::shared_ptr<Platform::Array<Platform::StringArg>> SharedStringArray;
#else
namespace Platform
{
	typedef Platform::String^ StringArg;
};
typedef Platform::Array<Platform::String^>^ SharedStringArray;
#endif // !HERZELEID_DESKTOP

#endif // !HERZELEID_PRECOMPILED_INCLUDED__
